产品集成资源文档定价
立即开始

© 2026 CapSolver. All rights reserved.

联系我们

Slack: lola@capsolver.com

产品

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • AWS WAF
  • 浏览器插件
  • 更多验证码类型

集成

  • Selenium
  • Playwright
  • Puppeteer
  • n8n
  • 合作伙伴
  • 查看所有集成

资源

  • 推荐返佣系统
  • 官方文档
  • API 参考
  • 博客
  • 常见问题 (FAQ)
  • 术语表
  • 系统状态

法律声明

  • 服务条款
  • 隐私政策
  • 退款政策
  • 请勿出售我的信息
博客/aws waf/如何通过 Python 解决 AWS 验证码/挑战
Sep20, 2023

如何通过 Python 解决 AWS 验证码/挑战

Adélia Cruz

Adélia Cruz

Neural Network Developer

简介

你的网络爬虫或自动化任务是否被看似无法克服的AWS WAF(Web应用防火墙)所阻止?这对许多开发人员来说是一个常见的挑战。AWS WAF是亚马逊设计的一种强大的安全服务,用于保护网站免受常见网络攻击和恶意机器人程序的侵害。它通过分析流量模式,使用JavaScript挑战(返回202状态码)和更复杂的图像验证码(返回405状态码)等方法来识别并阻止可疑活动。

虽然这些安全措施对于网站保护至关重要,但它们可能会成为合法自动化脚本的主要障碍。幸运的是,使用正确的工具,您可以有效绕过这些保护。本指南将详细介绍如何使用Python和**CapSolver**轻松获取aws-waf-token,从而无缝访问受AWS WAF保护的网站。

⚙️ 前提条件

在开始之前,请确保准备好以下工具和信息:

  • 一个可用的代理服务器:这是解决AWS WAF的关键。强烈建议使用ISP或住宅代理,以避免因IP信誉差而被阻止。
  • 已安装的Python:确保您的系统上已安装Python。
  • CapSolver API密钥:您需要注册一个CapSolver账户 (注册) 以从仪表板获取API密钥。

🤖 第1步:安装必要的Python包

首先,我们需要安装几个关键的Python库,用于发送HTTP请求和解析HTML。打开终端并执行以下命令:

bash Copy
pip install capsolver requests beautifulsoup4

👨‍💻 第2步:编写Python代码以解决AWS WAF

以下是在CapSolver的帮助下使用Python解决AWS WAF挑战和验证码的完整代码。该代码基于CapSolver官方文档的最新实践,结构更清晰,并能自动处理两种最常见的阻塞场景。

更新后的Python代码

python Copy
import capsolver
import requests
from bs4 import BeautifulSoup
import re
from urllib.parse import urlparse

# -------------------请修改以下值-------------------
# 代理服务器信息,格式为:http://用户名:密码@IP:端口
PROXY = "http://用户名:密码@IP:端口"
# 您要解决AWS WAF的网站目标URL
PAGE_URL = "https://www.您要访问的AWS保护网站.com"
# 从CapSolver仪表板获取的API密钥
CAPSOLVER_API_KEY = "您的API密钥"
# ---------------------------------------------------

def solve_aws_waf(is_captcha_challenge, **kwargs):
    """
    使用CapSolver解决AWS WAF挑战或验证码。
    :param is_captcha_challenge: True表示验证码(405状态码),False表示JS挑战(202状态码)。
    :param kwargs: 解决任务所需的参数。
    :return: 解决方案对象,或在失败时返回None。
    """
    task_type = "AntiAwsWafTask" if is_captcha_challenge else "AntiAwsWafTaskProxyLess"
    print(f"创建 '{task_type}' 任务...")
    
    task_payload = {
        "type": task_type,
        "websiteURL": PAGE_URL,
    }
    
    # 根据挑战类型添加特定参数
    if is_captcha_challenge:
        # 对于验证码挑战,需要awsKey、awsIv、awsContext
        task_payload.update({
            "awsKey": kwargs.get("awsKey"),
            "awsIv": kwargs.get("awsIv"),
            "awsContext": kwargs.get("awsContext"),
            "awsChallengeJS": kwargs.get("awsChallengeJS"),
            "proxy": PROXY
        })
    else:
        # 对于JS挑战,只需要awsChallengeJS的URL
        task_payload["awsChallengeJS"] = kwargs.get("awsChallengeJS")

    try:
        solution = capsolver.solve(task_payload)
        if solution and solution.get("errorId", 0) == 0:
            print("成功获取解决方案!")
            return solution
        else:
            error_desc = solution.get('errorDescription', '未知错误') if solution else '未知错误'
            print(f"解决任务失败: {error_desc}")
            return None
    except Exception as e:
        print(f"调用CapSolver时发生异常: {e}")
        return None

def main():
    """执行整个过程的主函数。"""
    capsolver.api_key = CAPSOLVER_API_KEY
    session = requests.Session()
    session.proxies = {"http": PROXY, "https": PROXY}
    
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
    }

    print(f"尝试访问: {PAGE_URL}")
    response = session.get(PAGE_URL, headers=headers)
    print(f"收到状态码: {response.status_code}")

    solution = None
    
    # 场景1:处理AWS JavaScript挑战(状态码202)
    if response.status_code == 202:
        print("检测到AWS JavaScript挑战。")
        soup = BeautifulSoup(response.content, 'html.parser')
        script_tag = soup.find('script', {'src': re.compile(r'token\.awswaf\.com')})
        if script_tag:
            challenge_js_url = script_tag['src']
            print(f"找到挑战JS URL: {challenge_js_url}")
            solution = solve_aws_waf(is_captcha_challenge=False, awsChallengeJS=challenge_js_url)
        else:
            print("错误:无法找到AWS挑战脚本。")

    # 场景2:处理AWS验证码(状态码405)
    elif response.status_code == 405:
        print("检测到AWS验证码。")
        soup = BeautifulSoup(response.content, 'html.parser')
        script_tag = soup.find('script', {'src': re.compile(r'token\.awswaf\.com')})
        script_text_tag = soup.find('script', string=re.compile('.*key.*'))
        
        if script_tag and script_text_tag:
            challenge_js_url = script_tag['src']
            script_text = script_text_tag.string
            
            key = re.search(r'"key":"(.*?)"', script_text).group(1)
            iv = re.search(r'"iv":"(.*?)"', script_text).group(1)
            context = re.search(r'"context":"(.*?)"', script_text).group(1)
            
            print(f"提取的参数: Key={key[:5]}..., IV={iv[:5]}..., Context={context[:5]}...")
            solution = solve_aws_waf(
                is_captcha_challenge=True,
                awsKey=key,
                awsIv=iv,
                awsContext=context,
                awsChallengeJS=challenge_js_url
            )
        else:
            print("错误:无法从页面中提取所有必需的验证码参数。")

    # 如果成功解决,设置cookie并重试请求
    if solution and solution.get("cookie"):
        aws_token = solution["cookie"]
        print(f"成功获取aws-waf-token: {aws_token[:30]}...")
        
        domain = f".{urlparse(PAGE_URL).netloc}"
        session.cookies.set("aws-waf-token", aws_token, domain=domain)
        
        print("Cookie已设置。正在重试请求...")
        final_response = session.get(PAGE_URL, headers=headers)
        print(f"最终请求状态码: {final_response.status_code}")
        
        if final_response.status_code == 200:
            print("成功绕过AWS WAF!")
            # print(final_response.text) # 取消注释以查看页面内容
        else:
            print("设置Cookie后请求失败。请检查token或代理。")
    else:
        print("无法解决AWS WAF。退出。")

if __name__ == "__main__":
    main()

⚠️ 需要修改的重要变量

在运行代码之前,请确保修改以下变量:

  • PROXY: 将其替换为您的代理服务器地址和凭证。格式应为 http://用户名:密码@IP:端口。
  • CAPSOLVER_API_KEY: 在**CapSolver仪表板**中找到您的API密钥并替换占位符。
  • PAGE_URL: 将其替换为受AWS WAF保护的目标网站的URL。

结论

通过将CapSolver集成到您的Python自动化流程中,您可以有效处理由AWS WAF触发的JavaScript挑战和验证码。这种方法将复杂的验证过程简化为一次API调用,使您能够专注于核心业务逻辑,而不是陷入与反机器人技术的持续对抗中。这对需要与受AWS WAF保护的网站交互的开发人员来说是一个无价的解决方案。

在为CapSolver账户充值时使用优惠码 CAPN,每次充值可额外获得 5% 的奖励 —— 没有限制。
立即在您的 CapSolver仪表板 中使用它

常见问题(FAQ)

Q1: 为什么必须使用代理?
A1: AWS WAF严格监控IP地址的行为。来自数据中心或被标记为可疑的IP的请求很容易被阻止。使用高质量的住宅或ISP代理可以模拟真实用户的访问行为,这是成功绕过WAF的关键第一步。

Q2: aws-waf-token 有效多久?
A2: 该令牌的有效期通常很短,可能只有几分钟。令牌过期后,您需要重新运行验证流程以获取新令牌。在您的应用程序中设计令牌刷新逻辑非常重要。

Q3: AntiAwsWafTask 和 AntiAwsWafTaskProxyLess 有什么区别?
A3: AntiAwsWafTask 用于解决AWS验证码,需要完整的浏览器环境(通常在405状态码下看到),并且需要您提供代理。AntiAwsWafTaskProxyLess 用于解决较简单的JavaScript挑战(202状态码),在CapSolver的服务器上解决,不需要您提供代理。我们的代码会根据状态码自动选择合适的任务类型。

Q4: 这种方法适用于所有使用AWS WAF的网站吗?
A4: 这种方法对大多数标准AWS WAF配置有效。然而,网站所有者可以自定义WAF规则,这可能会增加绕过难度。如果您遇到问题,请查阅CapSolver文档或联系支持。不同的挑战可能需要不同的策略。

查看更多

aws wafMar 24, 2026

如何在浏览器自动化中解决Amazon AWS WAF验证码

掌握通过专家策略在浏览器自动化中解决Amazon AWS WAF验证码挑战的技巧。学习如何集成CapSolver以实现无缝高效的自动化工作流程。本指南涵盖基于令牌和基于分类的解决方案。

Anh Tuan
Anh Tuan
aws wafSep 14, 2023

如何使用 PHP 解决 AWS 验证码/挑战:全面指南

一份详细的PHP指南,用于解决AWS WAF CAPTCHA和挑战,以实现可靠的数据抓取和自动化

Emma Foster

目录

Emma Foster
aws wafJul 12, 2023

如何解决 AWS WAF 验证码令牌

本博客解释如何使用 CapSolver 以快速、便宜和简单的方式解决 AWS WAF CAPTCHA

Ethan Collins
Ethan Collins
aws wafNov 29, 2023

如何使用Puppeteer [JavaScript] 通过CapSolver扩展解决AWS验证码

学习如何使用Puppeteer和Capsolver扩展无缝解决AWS CAPTCHA,一份关于有效设置和自动化CAPTCHA解决方案的详细指南

Ethan Collins
Ethan Collins